AWSアクセスキーをgitに誤って登録しないようにする
はじめに
Gitはとても便利ですが、GitHub上で不適切に公開されている秘密鍵を使ってAWSに不正アクセスする事例が発生 というようにAWSアクセスキー、シークレットキーを誤って登録してしまうととても恐いことになります。利用者側で気をつけられるようにGitのフックをつくってみましたので報告します。
Git フックとは?
Gitにはフックというなにかの操作の前後にスクリプトを実行できるような仕組みがあります。これを使うことにします。コミットの前に気づければよいのでpre-commitを使うことにします。サンプルファイルが .git/hooks/pre-commit.sampleにありますが、今回はシンプルにしたいので、.git/hooks/pre-commitをスクラッチで作ります。
アクセスキー混入防止フック
とてもシンプルです。git diffをしてその中に KEYという行があり、さらにその中にAKIA(これはAWSアクセスキーの接頭語なのですが、ほんとうにAKIAしかないのか? という確証がないです)があればAWSアクセスキーと見なしてコミットを失敗させます。
#!/bin/sh GREP_RESULT=`git diff --cached | grep KEY | grep AKIA` if [ -n "${GREP_RESULT}" ] then echo 'AWS_ACCESS_KEY might be in this index. Please check with git diff --cached' echo ${GREP_RESULT} exit 1 fi
このファイルをgitプロジェクトの.git/hooks/pre-commitとして保存して、実行権限をつけると動作します。
ためしてみる
pre-commitを設定した後、ファイルに擬似的にアクセスキーを設定します。
$ vi env.sh (アクセスキーをいれてみる) $ git diff diff --git a/env.sh b/env.sh index f082579..82ed527 100755 --- a/env.sh +++ b/env.sh @@ -1,6 +1,6 @@ #!/bin/sh export AWS_DEFAULT_REGION=ap-northeast-1 -export AWS_ACCESS_KEY_ID= +export AWS_ACCESS_KEY_ID=AKIAXXXXXXXXX export AWS_SECRET_ACCESS_KEY=
さっそく実行してみましょう。
$ git add env.sh $ git commit AWS_ACCESS_KEY might be in this index. Please check with git diff --cached +export AWS_ACCESS_KEY_ID=AKIAXXXXXXXXX
いい感じでエラーがでましたね。コミットの編集画面になってしまう方は、pre-commitの置く場所(.git/hooks/pre-commit)や実行権限(u+x)を確認されるとよいかとおもいます。
まとめ
gitでAWSキー登録をはじくためのhookを紹介しました。もちろん、これで完璧ではないです。シェル変数経由での設定等されるとすりぬけます。ここは各組織の流儀があるとおもうのでチェックロジックを適宜かえてもらえればとおもいます。これで少しでも誤登録がへるとよいですね。